/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Comandos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.ErroSemantico;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSemantica.estruturadedados.Identificador;
import analiseSemantica.estruturadedados.Token;
import analiseSintatica.AnalisadorSintatico;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;


import java.util.LinkedList;

/**
 *
 * @author Ivo Romário
 * 
 */
public class RegraScanf extends Regra{


    protected static Regra instancia;

    protected String estrutura = "scanf '(' identificador ')' ';'";

    
    /**
     * Construtor privado necessario ao singleton
     */
    private RegraScanf(){

    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraScanf getInstance() {
        if (instancia == null) {
            instancia = new RegraScanf();
        }
        return (RegraScanf) instancia;

    }

    

    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        

            listaTokens.removeFirst();
            reconheceLexema(listaTokens, "delimitador", "(", estrutura);
            Token token = AnalisadorSintatico.escopoatual.find(listaTokens.getFirst().getLexema());
            if(token == null || !(token instanceof Identificador))
            	AnalisadorSintatico.errosemanticos.add(new ErroSemantico("Identificador "+listaTokens.getFirst().getLexema()+" nao declarado", listaTokens.getFirst().getLinha()));
            else{
            	Identificador id = (Identificador)token;
            	if(id.isConstante())
            		AnalisadorSintatico.errosemanticos.add(new ErroSemantico("Identificador e uma constante", listaTokens.getFirst().getLinha()));
            }
            reconheceToken(listaTokens, "identificador", estrutura);
            reconheceLexema(listaTokens, "delimitador", ")", estrutura);
            reconheceLexema(listaTokens, "delimitador", ";", estrutura);

        return null;
       
    }
    
    @Override
    protected void setPrimeiro() {
        this.primeiro.add("scanf");
    }


}
